package com.tianji.aigc.tools;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import com.tianji.aigc.contans.Constant;
import com.tianji.aigc.tools.result.CourseInfo;
import com.tianji.aigc.utils.ToolResultHolder;
import com.tianji.api.client.course.CourseClient;
import lombok.RequiredArgsConstructor;
import org.springframework.ai.chat.model.ToolContext;
import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
@RequiredArgsConstructor
public class CourseTools {
    private final CourseClient courseClient;

    private static final String FIELD_NAME_FORMAT = "{}_{}";// 提取格式字符串常量

    /**
     * 根据课程id查询课程详细信息
     * @param courseId 课程id
     * @return 课程信息
     */
    /**
     * Tools 和 ToolParam 的作用
     * Tools 和 ToolParam 的作用是定义工具，并定义工具参数。
     * 如果没有这两个注解
     * 则 AI 无法识别和调用该工具。
     * 保留 description 属性很重要，它为 AI 提供了必要的上下文信息，确保工具能够被正确识别和调用。
     */
    @Tool(description = Constant.Tools.QUERY_COURSE_BY_ID)
    public CourseInfo queryCourseInfoById(@ToolParam(description = Constant.ToolParams.COURSE_ID) Long courseId,
                                          ToolContext toolContext) {
        return Optional.ofNullable(courseId)
                .map(id -> CourseInfo.of(courseClient.baseInfo(id, true)))
                .map(courseInfo -> {
                    // 存储数据的字段名
                    var field = StrUtil.format(FIELD_NAME_FORMAT,
                            //将类名的首字母转为小写
                            StrUtil.lowerFirst(CourseInfo.class.getSimpleName()),
                            courseInfo.getId());
                    // 存储的key Convert.toStr 将任意对象安全的转化为字符串
                    var requestId = Convert.toStr(toolContext.getContext().get(Constant.REQUEST_ID));
                    ToolResultHolder.put(requestId,field, courseInfo);
                    return courseInfo;
                })
                .orElse(null);
    }

}
